/*
 * Copyright 2020-2030 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.gitee.minimalismstyle.fresh.common.data.beetl.ami

import org.beetl.sql.clazz.TableDesc
import org.beetl.sql.clazz.kit.BeanKit
import org.beetl.sql.clazz.kit.BeetlSQLException
import org.beetl.sql.core.SQLManager
import org.beetl.sql.mapper.MapperInvoke
import java.lang.reflect.Method

/**
 * 插入或者更新 beetl Ami
 * @author maoxiaodong
 */
class SaveAmi : MapperInvoke() {

    override fun call(sm: SQLManager, entityClass: Class<Any>, m: Method?, args: Array<out Any>): Any {
        val obj = args[0]
        val tableName: String = sm.dbStyle.nameConversion.getTableName(entityClass)
        val table: TableDesc = sm.getTableDesc(tableName)
        val classDesc = table.genClassDesc(entityClass, sm.dbStyle.nameConversion)
        val idProperties = classDesc.idAttrs
        if (idProperties.size != 1) {
            throw BeetlSQLException(BeetlSQLException.ID_EXPECTED_ONE_ERROR, "save方法期望只有一个主键")
        }
        val pk = BeanKit.getBeanProperty(obj, idProperties[0]) ?: return sm.insert(entityClass, obj)

        sm.single(entityClass, pk) ?: return sm.insert(entityClass, obj)

        return sm.updateById(obj)
    }
}